package com.tt.payee.service.login.impl;


import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import com.tt.payee.service.login.WxLoginService;
import org.slf4j.Logger;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;


@Service
public class WxLoginServiceImpl extends WxMaServiceImpl implements WxLoginService {

    private Logger log = org.slf4j.LoggerFactory.getLogger(WxLoginServiceImpl.class);


    private Map<String, Object> map;

    @PostConstruct
    public void init() {
        WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
        config.setAppid("wx26ec493b024156b1");
        config.setSecret("74353f7726f440c7438320f7e09222d3");
        setWxMaConfig(config);
    }

    /**
     * 获取用户的OPENID、UNIONID
     *
     * @return
     * @throws Exception
     */
    @Override
    public HashMap<String, String> getSessionInfo(String jsCode, String encryptedData, String iv)  {

        HashMap<String, String> resultMap = new HashMap<>();
        HashMap<String, Object> map = new HashMap<>();
        WxMaUserInfo userInfo = new WxMaUserInfo();
        //UserAgent status = null;
        Map<String, String> phoneInfo = new HashMap<>();

        //获取sessionKey 解密获取 unionId
        WxMaJscode2SessionResult sessionInfo = null;

        try {
            sessionInfo = getUserService().getSessionInfo(jsCode);

            //判断是否登录(如果不判断直接获取unionid 有几率出现不可重现的错误出现)
            map.put("openId", sessionInfo.getOpenid());

            //status = wxmaMapper.lookForUser(map);

            //if(status == null){
            userInfo = getUserService().getUserInfo(sessionInfo.getSessionKey(), encryptedData, iv);
            phoneInfo = getPhone(sessionInfo.getSessionKey(),encryptedData, iv);

            //}

        } catch (Exception e) {

            log.error("微信授权登录出错了" , e);

            return null;
        }

        resultMap.put("unionId", userInfo.getUnionId());
        resultMap.put("openId", sessionInfo.getOpenid());
        resultMap.put("nickName", userInfo.getNickName());

        resultMap.put("session", sessionInfo.getSessionKey());

        //获取OPENID(展示不知道是否能够获取到unionid, 之后获取到unionid之后需要重写登录流程)
        //String decrypt = WxMaCryptUtils.decrypt(getUserService().getSessionInfo(jsCode).getSessionKey(), encryptedData, iv);

        return resultMap;
    }

    /**
     * 获取用户的手机号码
     *
     * @return
     * @throws Exception
     */
    @Override
    public HashMap<String, String> getPhone(String sessionKey, String encryptedData, String iv) throws Exception {

        HashMap<String, String> resultMap = new HashMap<>();

        //获取unionid
        WxMaPhoneNumberInfo phoneNoInfo = getUserService().getPhoneNoInfo(sessionKey, encryptedData, iv);

        resultMap.put("phone", phoneNoInfo.getPurePhoneNumber());

        return resultMap;
    }

//    /**
//     * 用户注册登录 (小程序)
//     *
//     * @return 用户对象
//     */
//    @Override
//    public UserAgent loginUser(String unionId, String openId, String nickName) throws Exception {
//
//        UserAgent status = null;
//
//        Map<String, Object> map = new HashMap<>();
//        map.put("openId", openId);
//
//        //是否判断是否有这个unionId登录用户
//        status = wxmaMapper.lookForUser(map);
//
//        //没有这个用户(创建新用户)
//        if (null == status) {
//            UserAgent userAgent = new UserAgent();
//            userAgent.setPassword("123344");
//            userAgent.setVip(0);
//            userAgent.setStatus(1);
//            userAgent.setLogindate(new Date());
//            userAgent.setLastlogindate(userAgent.getLogindate());
//            userAgent.setReferralcode(getReferralCode());
//            userAgent.setWxUnionid(unionId);
//            userAgent.setWxOpenid(openId);
//            userAgent.setWxName(nickName);
//
//            //如果没有创建一条user数据
//            int count = userAgentMapper.insertSelective(userAgent);
//
//            if (count != 1) {
//                throw new RuntimeException("保存用户失败");
//            }
//
//            status = wxmaMapper.lookForUser(map);
//
//        }
//
//        return status;
//    }
//
//    /**
//     * 根据openId 修改手机号码
//     *
//     * @return 用户对象
//     */
//    @Override
//    @Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
//    public UserAgent setPhone(String phoneNum, String openId) throws Exception{
//        UserAgent usrResult = wxmaMapper.selectUserByUserName(phoneNum);
//
//        //如果没有在app上注册过dd
//        if(usrResult == null){
//            int result = wxmaMapper.updatePhone1(phoneNum, openId);
//
//            if (result != 1) {
//                log.error("保存手机号码失败");
//                throw new RuntimeException("保存手机号码失败");
//            }
//
//
//            Map<String, Object> map = new HashMap<>();
//            map.put("openId", openId);
//
//            UserAgent userAgent = wxmaMapper.lookForUser(map);
//
//            int resultPoint = pointService.modifyPoint(userAgent.getUid(), PointEnum.get_phone.getPoint(), "注册成功赠送积分", "系统自动赠送");
//
//            if(resultPoint == 0){
//                log.error("赠送积分失败");
//                throw new RuntimeException("赠送积分失败");
//            }
//
//            return userAgent;
//        }
//
//
//        if(null != usrResult.getName()){
//
//            BigDecimal point = new BigDecimal(500);
//            BigDecimal userPoint = new BigDecimal(usrResult.getPoint());
//
//
//            Double point1;
//            //判断用户之前的积分是否大于500 如果大于则用之前的
//            if(point.compareTo(userPoint) >=0){
//                point1 = 500d;
//            }else {
//                point1 = usrResult.getPoint();
//            }
//
//
//            int result = wxmaMapper.updatePhone(usrResult.getPassword(),point1, usrResult.getVip(),
//                    0 ,phoneNum, openId);
//
//            if (result != 1) {
//                log.error("保存手机号码失败");
//                throw new RuntimeException("保存手机号码失败");
//            }
//
//            Map<String, Object> map = new HashMap<>();
//            map.put("openId", openId);
//
//            UserAgent userAgent = wxmaMapper.lookForUser(map);
//
//            return userAgent;
//
//        }
//        return null;
//
//    }
//
//    /**
//     * 修改用户是否第一次登录
//     *
//     * @return int
//     */
//    @Override
//    public int setUserFirst(String openId) {
//
//        return wxmaMapper.updateIsFirst(openId);
//    }
//    /**
//     * 获取用户的小程序码
//     *
//     * @param uid
//     * @param page
//     * @return
//     * @throws Exception
//     */
//    @Override
//    public String getWxQrCode(String uid, String page) throws Exception {
//
//        if (uid == null) {
//            uid = "0";
//        }
//
//        //获取用户小程序码(带跳转地址)
//        File wxaCodeUnlimit = getQrcodeService().createWxaCodeUnlimit(uid, page, 430, true, (WxMaCodeLineColor) null, true);
//
//        //上传七牛云
//        FileInputStream input = new FileInputStream(wxaCodeUnlimit);
//
//        MultipartFile multipartFile = new MockMultipartFile("file", wxaCodeUnlimit.getName(), "text/plain", input);
//
//        Map<String, MultipartFile> multipartFileMap = new HashMap<>();
//        multipartFileMap.put(wxaCodeUnlimit.getName(), multipartFile);
//
//        List<Map<String, String>> maps = QiNiuFileSystem.QiNiuuploadFile(multipartFileMap);
//
//        Map<String, String> stringStringMap = maps.get(0);
//        input.close();
//
//        return stringStringMap.get("path");
//    }
}